﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Drawing;
using System.Configuration;
using System.Xml;
using System.Xml.Serialization;
//--- el siguiente recurso (para exportar a excel) debe ser agregado al proyecto: Referencias-> agregar referencias -> .NET -> Microsoft.Office.Interop.Excel
//--- si no aparece en la lista, debe instalarse, puede ser descargado del siguiente Link: http://support.microsoft.com/kb/897646
using Excel = Microsoft.Office.Interop.Excel;
using System.Security.Cryptography;

namespace ControlPresupuesto
{
    class Utils
    {
        private ControlPresupuesto.ControlPresupuestoDataSetTableAdapters.spSeguridadParametroTableAdapter spSeguridadParametroTableAdapter = new ControlPresupuesto.ControlPresupuestoDataSetTableAdapters.spSeguridadParametroTableAdapter();
        private ControlPresupuestoDataSet.spSeguridadParametroDataTable spSeguridadParametroDataTable = new ControlPresupuestoDataSet.spSeguridadParametroDataTable();
        private readonly byte[] IV = new byte[8] { 240, 3, 45, 29, 0, 76, 173, 59 };  //--- este atributo se utiliza en los metodos: Encrypt y Decrypt
        private double temp = 0; //--- Esta variable se tuliza para realizar el convertir los distintos campos del presupuesto a numero

        private static Utils utils = null;
        private Utils(){}
        public static Utils get(){
            if(Utils.utils==null){Utils.utils = new Utils();}
            return Utils.utils;
        }

        public string getValorParametro(string codParametro)
        {
            this.spSeguridadParametroTableAdapter.FillBy(
                this.spSeguridadParametroDataTable,
                "SelectXCodParametro",
                null,
                null,
                codParametro,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
                );

            if (this.spSeguridadParametroDataTable.Rows.Count == 0)
            {
                return string.Empty;
            }

            foreach (ControlPresupuestoDataSet.spSeguridadParametroRow row in this.spSeguridadParametroDataTable.Rows)
            {
                return row.Valor;
            }
            return string.Empty;
        }

        public string getFormatoMoneda(string valor)
        {
            if (!double.TryParse(valor.Trim(), out this.temp))
            {
                return valor;
            }
            return this.getFormatoMoneda(temp);
        }
        public string getFormatoMoneda(double valor)
        {
            return valor.ToString("N", System.Globalization.CultureInfo.CurrentCulture.NumberFormat); //"#,0.00"
        }


        public string exportar(DataGridView dataGridView)
        {
            return this.exportar(dataGridView, (dataGridView.Name.Replace("DataGridView", "").Length > 1 ? dataGridView.Name.Replace("DataGridView", "") : dataGridView.Name), false,false);
        }
        public string exportar(DataGridView dataGridView, bool formatearCabecera)
        {
            return this.exportar(dataGridView, (dataGridView.Name.Replace("DataGridView", "").Length > 1 ? dataGridView.Name.Replace("DataGridView", "") : dataGridView.Name), false,formatearCabecera);
        }
        public string exportar(DataGridView dataGridView, string nombreArchivo, bool mostrarColumnasOcultas, bool formatearCabecera)
        {
            string rutaArchivo;
            try
            {
                if (dataGridView.Columns.Count >= 10 && dataGridView.Rows.Count > 5000)
                {
                    if (MessageBox.Show("La tabla que desea exportar tiene mucha información. Es posible que tarde varios minutos preparando la informacion. \n\n¿Desea Exportarla a un archivo EXCEL sin formato para que el proceso sea mas rapido? \n\nSeleccione NO para exportar con formato.", "Confirmacion", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        return this.exportarXLS_Sencillo(dataGridView);
                    }
                }

                //-- buscar el archivo
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.FileName = nombreArchivo;
                saveFileDialog.FilterIndex = 2;
                saveFileDialog.RestoreDirectory = true;

                if (saveFileDialog.ShowDialog() != DialogResult.OK)
                {
                    return "Cancelado";
                }
                Cursor.Current = Cursors.WaitCursor;
                saveFileDialog.FileName = saveFileDialog.FileName + ".xls";


                //-- genero el excel.
                Excel.Application xlApp;
                Excel.Workbook xlWorkBook;
                Excel.Worksheet xlWorkSheet;
                object misValue = System.Reflection.Missing.Value;

                xlApp = new Excel.Application();
                xlWorkBook = xlApp.Workbooks.Add(true);
                xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);//(Excel.Worksheet)xlWorkBook.ActiveSheet;

                //--- Coloco un borde al recuadro de la pagina
                Excel.Range oRange1 = (Excel.Range)xlWorkSheet.get_Range(xlWorkSheet.Cells[1, 1], xlWorkSheet.Cells[dataGridView.Rows.Count + 1, dataGridView.Columns.Count]);
                oRange1.Borders.LineStyle = Excel.XlLineStyle.xlContinuous;
                

                //--- Formateo la cabecera
                if (formatearCabecera)
                {
                    Excel.Range oRange2 = (Excel.Range)xlWorkSheet.get_Range(xlWorkSheet.Cells[1, 1], xlWorkSheet.Cells[1, dataGridView.Columns.Count]);
                    oRange2.Font.Bold = true;
                    oRange2.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                    oRange2.Interior.ColorIndex = 33;  // (36: amarillo, 43: Verde, 39: Morado) ///---- Paleta de colores: http://dmcritchie.mvps.org/excel/colors.htm 
                    object _missing;
                    _missing = System.Reflection.Missing.Value;
                    oRange2.AutoFilter(1, _missing, Excel.XlAutoFilterOperator.xlAnd, _missing, true);
                }

                //Se colocan los titulos de las columnas
                foreach (DataGridViewColumn col in dataGridView.Columns)
                {
                    if (mostrarColumnasOcultas || col.Visible)
                    {
                        xlWorkSheet.Cells[1, col.Index + 1] = col.HeaderText.ToUpper();
                    }
                    else
                    {
                        xlWorkSheet.Cells[1, col.Index + 1] = string.Empty;
                    }
                }
                foreach (DataGridViewRow row in dataGridView.Rows)
                {
                    foreach (DataGridViewCell item in row.Cells)
                    {
                        if (mostrarColumnasOcultas || dataGridView.Columns[item.ColumnIndex].Visible)
                        {
                            xlWorkSheet.Cells[row.Index + 2, item.ColumnIndex + 1] = (item.ValueType.Name.Equals("Boolean") ? (item.FormattedValue.ToString().ToLower() == "false" ? "NO" : "SI") : item.FormattedValue.ToString());
                        }
                        else
                        {
                            xlWorkSheet.Cells[row.Index + 2, item.ColumnIndex + 1] = string.Empty;
                        }
                    }
                }
                xlWorkSheet.Columns.AutoFit();
                try { xlWorkBook.SaveAs(saveFileDialog.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); }
                catch (Exception ex) { MessageException.show(ex); return "Cancelado"; }
                xlWorkBook.Close(true, misValue, misValue);
                xlApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);

                xlWorkSheet = null;
                xlWorkBook = null;
                xlApp = null;

                rutaArchivo = saveFileDialog.FileName;
            }
            catch (Exception ex)
            {
                Cursor.Current = Cursors.Default;
                MessageException.show(ex);
                return "Error";
            }
            GC.Collect();
            Cursor.Current = Cursors.Default;
            return rutaArchivo;
        }
        public string exportar(DataTable dataTable)
        {
            return this.exportar(dataTable, false);
        }
        public string exportar(DataTable dataTable, bool formatearCabecera)
        {
            if (dataTable.Columns.Count >= 10 && dataTable.Rows.Count > 5000)
            {
                if (MessageBox.Show("La tabla que desea exportar tiene mucha información. Es posible que tarde varios minutos preparando la informacion. \n\n¿Desea Exportarla a un archivo EXCEL sin formato para que el proceso sea mas rapido? \n\nSeleccione NO para exportar con formato.", "Confirmacion", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    return this.exportarXLS_Sencillo(dataTable);
                }
            }

            string nombreArchivo=dataTable.TableName;
            string rutaArchivo;
            string ColumnasExcluidas = ""; //"[ID],";

            try
            {
                
                //-- buscar el archivo
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.FileName = nombreArchivo;
                saveFileDialog.FilterIndex = 2;
                saveFileDialog.RestoreDirectory = true;

                if (saveFileDialog.ShowDialog() != DialogResult.OK)
                {
                    return "Cancelado";
                }
                Cursor.Current = Cursors.WaitCursor;
                saveFileDialog.FileName = saveFileDialog.FileName + ".xls";

                //-- genero el excel.
                Excel.Application xlApp;
                Excel.Workbook xlWorkBook;
                Excel.Worksheet xlWorkSheet;
                object misValue = System.Reflection.Missing.Value;

                xlApp = new Excel.Application();
                xlWorkBook = xlApp.Workbooks.Add(true);
                xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);//(Excel.Worksheet)xlWorkBook.ActiveSheet;

                //--- Coloco un borde al recuadro de la pagina
                Excel.Range oRange1 = (Excel.Range)xlWorkSheet.get_Range(xlWorkSheet.Cells[1, 1], xlWorkSheet.Cells[dataTable.Rows.Count+1, dataTable.Columns.Count]);
                oRange1.Borders.LineStyle = Excel.XlLineStyle.xlContinuous;
                //oRange1.Borders.Color = System.Drawing.ColorTranslator.ToWin32(System.Drawing.Color.Black);
                

                //--- Formateo la cabecera
                if (formatearCabecera)
                {
                    Excel.Range oRange2 = (Excel.Range)xlWorkSheet.get_Range(xlWorkSheet.Cells[1, 1], xlWorkSheet.Cells[1, dataTable.Columns.Count]);
                    oRange2.Font.Bold = true;
                    oRange2.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                    oRange2.Interior.ColorIndex = 33;  // (36: amarillo, 43: Verde, 39: Morado) ///---- Paleta de colores: http://dmcritchie.mvps.org/excel/colors.htm 
                    object _missing;
                    _missing = System.Reflection.Missing.Value;
                    oRange2.AutoFilter(1, _missing, Excel.XlAutoFilterOperator.xlAnd, _missing, true);
                }

                //Se colocan los titulos de las columnas
                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    if (!ColumnasExcluidas.Contains("[" + dataTable.Columns[i].ColumnName.ToUpper() + "]"))
                    {  
                        xlWorkSheet.Cells[1, i + 1] = dataTable.Columns[i].ColumnName.ToUpper();                        
                    }
                    else
                    {
                        xlWorkSheet.Cells[1, i + 1] = "";
                    }
                }

                //--- Se agregan los datos
                //if (dataTable.Rows.Count > 20000 && dataTable.Columns.Count > 10)
                //{
                //    MessageBox.Show("La informacion que desea exportar tiene demasiados registros, NO se ");
                //}

                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    Object[] items = dataTable.Rows[i].ItemArray;
                    for (int j = 0; j < dataTable.Columns.Count; j++)
                    {
                        if (!ColumnasExcluidas.Contains("[" + dataTable.Columns[j].ColumnName.ToUpper() + "]"))
                        {
                            xlWorkSheet.Cells[i + 2, j + 1] = (dataTable.Columns[j].DataType.Name.Equals("Decimal") ? this.getFormatoMoneda(items[j].ToString()) : items[j].ToString());
                        }
                        else
                        {
                            xlWorkSheet.Cells[i + 2, j + 1] = "";
                        }
                    }
                }
                xlWorkSheet.Columns.AutoFit();
                try { xlWorkBook.SaveAs(saveFileDialog.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); }
                catch (Exception ex) { MessageException.show(ex); return "Cancelado"; }
                xlWorkBook.Close(true, misValue, misValue);
                xlApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);

                xlWorkSheet = null;
                xlWorkBook = null;
                xlApp = null;

                rutaArchivo = saveFileDialog.FileName;
            }
            catch (Exception ex)
            {
                Cursor.Current = Cursors.Default;
                MessageException.show(ex);
                return "Error";
            }
            GC.Collect();
            Cursor.Current = Cursors.Default;
            return rutaArchivo;
        }
        /// <summary>
        /// Cuando la grilla que se desea exportar tiene muchos datos, el usuario tiene la opcion de exportar los datos a un excel sin formato para que dicha exportacion sea mas rapida
        /// </summary>
        /// <param name="dataTable"></param>
        /// <returns></returns>
        public string exportarXLS_Sencillo(DataTable dataTable)
        {
            string nombreArchivo=dataTable.TableName;
            string rutaArchivo;            
            try
            {
                //-- buscar el archivo
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.FileName = nombreArchivo;
                saveFileDialog.FilterIndex = 2;
                saveFileDialog.RestoreDirectory = true;

                if (saveFileDialog.ShowDialog() != DialogResult.OK)
                {
                    return "Cancelado";
                }
                Cursor.Current = Cursors.WaitCursor;
                saveFileDialog.FileName = saveFileDialog.FileName + ".xls";
                rutaArchivo = saveFileDialog.FileName;

                const string FIELDSEPARATOR = "\t";
                const string ROWSEPARATOR = "\n";
                StringBuilder output = new StringBuilder();
                // Escribir encabezados    
                foreach (DataColumn dc in dataTable.Columns)
                {
                    output.Append(dc.ColumnName);
                    output.Append(FIELDSEPARATOR);
                }
                output.Append(ROWSEPARATOR);
                foreach (DataRow item in dataTable.Rows)
                {
                    foreach (object value in item.ItemArray)
                    {
                        output.Append(value.ToString().Replace('\n', ' ').Replace('\r', ' ')/*.Replace('.', ',')*/);
                        output.Append(FIELDSEPARATOR);
                    }
                    // Escribir una línea de registro        
                    output.Append(ROWSEPARATOR);
                }
                StreamWriter sw = new StreamWriter(rutaArchivo);
                sw.Write(output.ToString());
                sw.Close();
            }
            catch (Exception ex)
            {
                Cursor.Current = Cursors.Default;
                MessageException.show(ex);
                return "Error";
            }
            return string.Empty;
        }
        public string exportarXLS_Sencillo(DataGridView dataGridView)
        {
            string nombreArchivo = (dataGridView.Name.Replace("DataGridView", "").Length > 1 ? dataGridView.Name.Replace("DataGridView", "") : dataGridView.Name);
            string rutaArchivo;
            try
            {
                //-- buscar el archivo
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.FileName = nombreArchivo;
                saveFileDialog.FilterIndex = 2;
                saveFileDialog.RestoreDirectory = true;

                if (saveFileDialog.ShowDialog() != DialogResult.OK)
                {
                    return "Cancelado";
                }
                Cursor.Current = Cursors.WaitCursor;
                saveFileDialog.FileName = saveFileDialog.FileName + ".xls";
                rutaArchivo = saveFileDialog.FileName;

                const string FIELDSEPARATOR = "\t";
                const string ROWSEPARATOR = "\n";
                StringBuilder output = new StringBuilder();
                // Escribir encabezados    
                foreach (DataGridViewColumn dc in dataGridView.Columns)
                {
                    output.Append(dc.HeaderText);
                    output.Append(FIELDSEPARATOR);
                }
                output.Append(ROWSEPARATOR);
                foreach (DataGridViewRow item in dataGridView.Rows)
                {
                    foreach (DataGridViewCell cell in item.Cells)
                    {
                        output.Append(cell.Value.ToString().Replace('\n', ' ').Replace('\r', ' ')/*.Replace('.', ',')*/);
                        output.Append(FIELDSEPARATOR);
                    }
                    // Escribir una línea de registro        
                    output.Append(ROWSEPARATOR);
                }
                StreamWriter sw = new StreamWriter(rutaArchivo);
                sw.Write(output.ToString());
                sw.Close();
            }
            catch (Exception ex)
            {
                Cursor.Current = Cursors.Default;
                MessageException.show(ex);
                return "Error";
            }
            return string.Empty;
        }

        public string exportar_PresupuestoAnualEn3Fases_DIRECCIONES(DataTable dataTable)
        {
            
            string nombreArchivo = dataTable.TableName;
            string rutaArchivo;
            string ColumnasExcluidas = "[TipoFilaReporte],";
            int tempColumna = 0;

            BindingSource bs = new BindingSource();
            bs.DataSource = dataTable;
            DataGridView dataGridView = new DataGridView();
            dataGridView.DataSource = bs;
            dataGridView.Refresh();
            try
            {
                //Cursor.Current = Cursors.WaitCursor;

                //-- buscar el archivo
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.FileName = nombreArchivo;
                saveFileDialog.FilterIndex = 2;
                saveFileDialog.RestoreDirectory = true;

                if (saveFileDialog.ShowDialog() != DialogResult.OK)
                {
                    return "Cancelado";
                }
                Cursor.Current = Cursors.WaitCursor;
                saveFileDialog.FileName = saveFileDialog.FileName + ".xls";

                //-- genero el excel.
                Excel.Application xlApp;
                Excel.Workbook xlWorkBook;
                Excel.Worksheet xlWorkSheet;
                object misValue = System.Reflection.Missing.Value;

                xlApp = new Excel.Application();
                xlWorkBook = xlApp.Workbooks.Add(true);
                xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);//(Excel.Worksheet)xlWorkBook.ActiveSheet;

                //--- Coloco un borde al recuadro de la pagina
                Excel.Range oRange1 = (Excel.Range)xlWorkSheet.get_Range(xlWorkSheet.Cells[1, 1], xlWorkSheet.Cells[dataTable.Rows.Count + 1, dataTable.Columns.Count-1]);
                oRange1.Borders.LineStyle = Excel.XlLineStyle.xlContinuous;
                oRange1.ColumnWidth = ((double)oRange1.ColumnWidth) * 1.7;
                
                //--- Cambio el ancho de la primera columna del reporte para que el nombre del rubro salga completo
                oRange1 = (Excel.Range)xlWorkSheet.get_Range(xlWorkSheet.Cells[1, 1], xlWorkSheet.Cells[dataTable.Rows.Count + 1,1]);
                oRange1.ColumnWidth = ((double)oRange1.ColumnWidth) * 2.5;
                
                //--- Formateo la cabecera del reporte
                oRange1 = (Excel.Range)xlWorkSheet.get_Range(xlWorkSheet.Cells[1, 1], xlWorkSheet.Cells[1, dataTable.Columns.Count-1]);
                oRange1.RowHeight = ((double)oRange1.RowHeight) * 3;
                oRange1.Font.Bold = true;
                oRange1.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                oRange1.VerticalAlignment = Excel.XlHAlign.xlHAlignCenter;
                oRange1.Interior.ColorIndex = 37;  // (36: amarillo, 43: Verde, 39: Morado) ///---- Paleta de colores: http://dmcritchie.mvps.org/excel/colors.htm 
                oRange1.Columns.WrapText = true;
                
                tempColumna = 0;

                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    if (!ColumnasExcluidas.ToUpper().Contains("[" + dataTable.Columns[i].ColumnName.ToUpper() + "]"))
                    {
                        xlWorkSheet.Cells[1, tempColumna + 1] = dataTable.Columns[i].ColumnName.ToUpper();
                        tempColumna++;                        
                    }
                }

                //--- Se agregan los datos
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    Object[] items = dataTable.Rows[i].ItemArray;

                    //--- Formateo la fila
                    Excel.Range oRangeTemp = (Excel.Range)xlWorkSheet.get_Range(xlWorkSheet.Cells[i+2, 1], xlWorkSheet.Cells[i+2, dataTable.Columns.Count - 1]);
                    if("Detalle".Equals(items[0].ToString()))
                    {
                        oRangeTemp.Interior.ColorIndex = 2;
                    }
                    else if ("TotalNomina".Equals(items[0].ToString()))
                    {
                        oRangeTemp.Interior.ColorIndex = 36;
                        oRangeTemp.Font.Bold = true;
                    }
                    else if ("TotalTipoRubro".Equals(items[0].ToString()) || "TotalPresupuesto".Equals(items[0].ToString()))
                    {
                        oRangeTemp.Interior.ColorIndex = 49;
                        oRangeTemp.Font.ColorIndex = 2;
                        oRangeTemp.Font.Bold = true;
                    }
                    
                    tempColumna = 0;
                    
                    for (int j = 0; j < dataTable.Columns.Count; j++)
                    {

                        if (!ColumnasExcluidas.ToUpper().Contains("[" + dataTable.Columns[j].ColumnName.ToUpper() + "]"))
                        {
                            xlWorkSheet.Cells[i + 2, tempColumna + 1] = (dataTable.Columns[j].DataType.Name.Equals("Decimal") ? this.getFormatoMoneda(items[j].ToString()) : items[j].ToString());
                            tempColumna++;
                        }
                    }
                }
                //xlWorkSheet.Columns.AutoFit();

                try { xlWorkBook.SaveAs(saveFileDialog.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); }
                catch (Exception ex) { MessageException.show(ex); return "Cancelado"; }
                xlWorkBook.Close(true, misValue, misValue);
                xlApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);

                xlWorkSheet = null;
                xlWorkBook = null;
                xlApp = null;

                rutaArchivo = saveFileDialog.FileName;
            }
            catch (Exception ex)
            {
                Cursor.Current = Cursors.Default;
                MessageException.show(ex);
                return "Error";
            }
            GC.Collect();
            Cursor.Current = Cursors.Default;
            return rutaArchivo;
        }


        public string dataGridViewToXML(DataGridView miDataGrid)
        {
            string retorno = string.Empty;
            DataTable dtNuevo = new DataTable();
            DataColumn colNueva;
            DataRow filaNueva;
            int numCols;

            try
            {
                //-- como el datagrid no tiene datasource, debo crear un datatable y volcar la informaicon que esta en el datagrid en dicho datatable para poder pasar la informacion a XML.                    
                // Replicamos las columnas del DataGridView en el DataTable nuevo
                foreach (DataGridViewColumn dataGridViewCol in miDataGrid.Columns)
                {
                    colNueva = new DataColumn(dataGridViewCol.Name);
                    dtNuevo.Columns.Add(colNueva);
                }

                numCols = dtNuevo.Columns.Count;

                //   ' Rellenamos los valores del DataTable nuevo con los valores de las celdas del DataGridView
                foreach (DataGridViewRow filaDatos in miDataGrid.Rows)
                {
                    if (!filaDatos.IsNewRow)
                    {
                        filaNueva = dtNuevo.NewRow();
                        for (int i = 0; i < numCols; i++)
                        {
                            filaNueva[i] = filaDatos.Cells[i].Value.ToString();
                        }
                        dtNuevo.Rows.Add(filaNueva);
                    }
                }
                dtNuevo.TableName = "XML_TABLE";

                //--- Quito los campos que no aplican, para disminuir la longitud del XML
                //dtNuevo.Columns.Remove("Procesado");
                //dtNuevo.Columns.Remove("DESCRIPCION");

                using (StringWriter sw = new StringWriter())
                {
                    dtNuevo.WriteXml(sw);
                    retorno = sw.ToString();
                    retorno = retorno.Replace("&", " ");
                }
            }
            catch (Exception)
            {
                //MessageException.show(ex);
                return string.Empty;
            }
            return retorno;
        }
        public string dataTableToXML(DataTable miDataTable)
        {            
            string retorno = string.Empty;
            DataTable dtNuevo = new DataTable();
            DataColumn colNueva;
            DataRow filaNueva;
            int numCols;

            try
            {
                //-- como el datagrid no tiene datasource, debo crear un datatable y volcar la informaicon que esta en el datagrid en dicho datatable para poder pasar la informacion a XML.                    
                // Replicamos las columnas del DataGridView en el DataTable nuevo
                foreach (DataColumn dataGridViewCol in miDataTable.Columns)
                {
                    colNueva = new DataColumn(dataGridViewCol.ColumnName);
                    dtNuevo.Columns.Add(colNueva);
                }

                numCols = dtNuevo.Columns.Count;

                //   ' Rellenamos los valores del DataTable nuevo con los valores de las celdas del DataGridView
                foreach (DataRow filaDatos in miDataTable.Rows)
                {
                    //   filaDatos as DataGridViewRow In miDataGrid.Rows
                    //if(filaDatos!=null)
                    //{
                    filaNueva = dtNuevo.NewRow();
                    for (int i = 0; i < numCols; i++)
                    {
                        filaNueva[i] = filaDatos[i].ToString();
                    }
                    dtNuevo.Rows.Add(filaNueva);
                    //}
                }
                dtNuevo.TableName = "XML_TABLE";


                using (StringWriter sw = new StringWriter())
                {
                    //sw.Encoding = Encoding.Unicode;
                    //Encoding encoding = sw.Encoding;
                    
                    dtNuevo.WriteXml(sw);
                    retorno = sw.ToString();
                    retorno = retorno.Replace("&", " ");
                }
            }
            catch (Exception)
            {
                //MessageException.show(ex);
                return string.Empty;
            }
            return retorno;
        }

        public Image byteToImage(byte[] imagenInByte)
        {
            if (imagenInByte != null)
            {
                return Image.FromStream(new MemoryStream((imagenInByte)));
            }
            return null;
        }
        public Image fileToImage(string rutaArchivo)
        {
            try
            {
                String strBLOBFilePath = @"" + rutaArchivo;
                FileStream fsBLOBFile = new FileStream(strBLOBFilePath, FileMode.Open, FileAccess.Read);
                Image image = Image.FromStream(fsBLOBFile);
                fsBLOBFile.Close();
                return image;
            }
            catch (Exception)
            {
                return null;
            }
        }
        public byte[] imageToByte(Image imagen)
        {
            try
            {
                MemoryStream ms = new MemoryStream();
                imagen.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                return ms.ToArray();
            }
            catch (Exception)
            {
                return null;
            }
        }

        public void blanquearCampos(Form form)
        {
            //-- Cambio el estado de la ventana dependiendo del parametro correspondiente
            form.WindowState = ((Utils.get().getValorParametro("MaximizarFormulariosDeLaAplicacion").Equals("SI") ? true : false) ? FormWindowState.Maximized : form.WindowState);

            //-- Mapeo todo el formulario recirsivamente para blanquear todos los campos del mismo
            foreach (Control c in form.Controls)
            {
                if (c.GetType().ToString().Equals("System.Windows.Forms.Panel"))
                {
                    this.blanquearCampos(((System.Windows.Forms.Panel)c).Controls);
                }
                else if (c.GetType().ToString().Equals("System.Windows.Forms.GroupBox"))
                {
                    this.blanquearCampos(((System.Windows.Forms.GroupBox)c).Controls);
                }
                this.blanquearCampos(form.Controls);
            }
        }
        private void blanquearCampos(Control.ControlCollection controls)
        {
            foreach (Control c in controls)
            {
                if (c.GetType().ToString().Equals("System.Windows.Forms.Panel"))
                {
                    this.blanquearCampos(((System.Windows.Forms.Panel)c).Controls);
                }
                else if (c.GetType().ToString().Equals("System.Windows.Forms.GroupBox"))
                {
                    this.blanquearCampos(((System.Windows.Forms.GroupBox)c).Controls);
                }
                
                if (c.GetType().ToString().Equals("ControlesAWIL.BuscadorAWIL"))
                {
                    if (((ControlesAWIL.BuscadorAWIL)c).AWIL_Texto != string.Empty)
                    {
                        ((ControlesAWIL.BuscadorAWIL)c).AWIL_Texto = string.Empty;
                    }
                }
                else if (c.GetType().ToString().Equals("System.Windows.Forms.TextBox"))
                {
                    if(((System.Windows.Forms.TextBox)c).Text != string.Empty)
                    {
                        ((System.Windows.Forms.TextBox)c).Text = string.Empty;
                    }
                }
                else if (c.GetType().ToString().Equals("System.Windows.Forms.NumericUpDown"))
                {
                    if (((System.Windows.Forms.NumericUpDown)c).Value != 0)
                    {
                        ((System.Windows.Forms.NumericUpDown)c).Value = 0;
                    }
                }
                else if (c.GetType().ToString().Equals("System.Windows.Forms.CheckBox"))
                {
                    if (((System.Windows.Forms.CheckBox)c).Checked)
                    {
                        ((System.Windows.Forms.CheckBox)c).Checked = false;
                    }
                }
                else if (c.GetType().ToString().Equals("System.Windows.Forms.DateTimePicker"))
                {
                    if (((System.Windows.Forms.DateTimePicker)c).Checked)
                    {
                        ((System.Windows.Forms.DateTimePicker)c).Value = DateTime.Now;
                    }
                }
                else if (c.GetType().ToString().Equals("System.Windows.Forms.BindingNavigator"))
                {
                    System.Windows.Forms.BindingNavigator bindingNavigator = (System.Windows.Forms.BindingNavigator)c;
                    foreach(System.Windows.Forms.ToolStripItem item in bindingNavigator.Items)
                    {
                        if (item.GetType().ToString().Equals("System.Windows.Forms.ToolStripTextBox"))
                        {
                            if (((System.Windows.Forms.ToolStripTextBox)item).Text != string.Empty)
                            {
                                ((System.Windows.Forms.ToolStripTextBox)item).Text = string.Empty;
                            }
                        }   
                    }
                }
            }
        }

        public void controlarDataErrorEnTodosLosDataGridView(Form form)
        {
            //-- Mapeo todo el formulario recursivamente para Obtener todos los DataGridView
            foreach (Control c in form.Controls)
            {
                if (c.GetType().ToString().Equals("System.Windows.Forms.Panel"))
                {
                    this.controlarDataErrorEnTodosLosDataGridView(((System.Windows.Forms.Panel)c).Controls);
                }
                else if (c.GetType().ToString().Equals("System.Windows.Forms.GroupBox"))
                {
                    this.controlarDataErrorEnTodosLosDataGridView(((System.Windows.Forms.GroupBox)c).Controls);
                }
                this.controlarDataErrorEnTodosLosDataGridView(form.Controls);
            }
        }
        private void controlarDataErrorEnTodosLosDataGridView(Control.ControlCollection controls)
        {
            foreach (Control c in controls)
            {
                if (c.GetType().ToString().Equals("System.Windows.Forms.Panel"))
                {
                    this.blanquearCampos(((System.Windows.Forms.Panel)c).Controls);
                }
                else if (c.GetType().ToString().Equals("System.Windows.Forms.GroupBox"))
                {
                    this.blanquearCampos(((System.Windows.Forms.GroupBox)c).Controls);
                }

                if (c.GetType().ToString().Equals("System.Windows.Forms.DataGridView"))
                {
                    ((System.Windows.Forms.DataGridView)c).DataError += new DataGridViewDataErrorEventHandler(this.dataGridView_DataError);
                }
            }
        }
        private void dataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            //--- Aqui se puede realizar algo interesante con los erores que se presenten en las grillas, ejemplo: grabar en un log, mostrar algun mensaje al usuario, etc.
        }


        public string Encrypt(string key, string clave, bool MostrarMsgError)
        {
            if (clave == null || clave.Length == 0) return string.Empty;

            //--- combino el texto con el Key para incrementar su complejidad
            MD5 md5 = MD5CryptoServiceProvider.Create();
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] stream = null;
            StringBuilder sb = new StringBuilder();
            string temp = string.Empty;
            //-- le aplico el algoritmo MD5 al key
            stream = md5.ComputeHash(encoding.GetBytes(key));
            for (int i = 0; i < stream.Length; i++)
            {
                sb.AppendFormat("{0:x2}", stream[i]);
            }
            temp = sb.ToString();
            clave = temp.Substring(0, temp.Length / 2) + clave.Substring(0, clave.Length / 2) + temp.Substring((temp.Length / 2)) + clave.Substring((clave.Length / 2));

            string result = string.Empty;

            try
            {
                byte[] buffer = Encoding.ASCII.GetBytes(clave);
                TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
                MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
                des.Key = MD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key));
                des.IV = IV;
                result = Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length));
            }
            catch (Exception E)
            {
                if (MostrarMsgError)
                {
                    System.Windows.Forms.MessageBox.Show(E.Message, "Utils.Encrypt");
                }
            }
            return result;
        }
        public string Decrypt(string key, string clave, bool MostrarMsgError)
        {
            if (clave == null || clave.Length == 0) return string.Empty;

            string result = string.Empty;

            try
            {
                byte[] buffer = Convert.FromBase64String(clave);

                TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
                MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
                des.Key = MD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key));
                des.IV = IV;

                result = Encoding.ASCII.GetString(des.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length));

                //--- Sustraigo el key del resultado
                MD5 md5 = MD5CryptoServiceProvider.Create();
                ASCIIEncoding encoding = new ASCIIEncoding();
                byte[] stream = null;
                StringBuilder sb = new StringBuilder();
                string temp = string.Empty;
                //-- le aplico el algoritmo MD5 al key
                stream = md5.ComputeHash(encoding.GetBytes(key));
                for (int i = 0; i < stream.Length; i++)
                {
                    sb.AppendFormat("{0:x2}", stream[i]);
                }
                temp = sb.ToString();
                result = result.Replace(temp.Substring(0, temp.Length / 2), "");
                result = result.Replace(temp.Substring(temp.Length / 2), "");
            }
            catch (Exception E)
            {
                if (MostrarMsgError)
                {
                    System.Windows.Forms.MessageBox.Show(E.Message, "Utils.Decrypt");
                }
            }
            return result;
        }
        public bool IsEncrypted(string key, string clave)
        {
            if (clave == null || clave.Length == 0) return false;

            string result = string.Empty;

            try
            {
                byte[] buffer = Convert.FromBase64String(clave);

                TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
                MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
                des.Key = MD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key));
                des.IV = IV;

                result = Encoding.ASCII.GetString(des.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length));

                //--- Sustraigo el key del resultado
                MD5 md5 = MD5CryptoServiceProvider.Create();
                ASCIIEncoding encoding = new ASCIIEncoding();
                byte[] stream = null;
                StringBuilder sb = new StringBuilder();
                string temp = string.Empty;
                //-- le aplico el algoritmo MD5 al key
                stream = md5.ComputeHash(encoding.GetBytes(key));
                for (int i = 0; i < stream.Length; i++)
                {
                    sb.AppendFormat("{0:x2}", stream[i]);
                }
                temp = sb.ToString();
                result = result.Replace(temp.Substring(0, temp.Length / 2), "");
                result = result.Replace(temp.Substring(temp.Length / 2), "");
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }


        //public void ConfigurarOBDC()
        //{
        //    System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
        //    builder.ConnectionString = ConfigurationManager.ConnectionStrings[Utils.get().getValorParametro("SeccionAppConfigGestionRecaudosConnectionString")].ConnectionString;

        //    // psTipo solo indica cual de las dos conexiones que debo crear es la que creare
        //    string sMensaje = "";
        //    //string sParametros = "";
        //    string sParametros = "\"SQL Server\"";
        //    sParametros += " \"DSN=" + builder.InitialCatalog+'('+builder.DataSource + ')';
        //    sParametros += "|DESCRIPTION=" + builder.InitialCatalog + '(' + builder.DataSource + ')';
        //    sParametros += "|SERVER=" + builder.DataSource;
        //    sParametros += "|TRUSTED_CONNECTION=False";
        //    sParametros += "|DATABASE=" + builder.InitialCatalog;
        //    //sParametros += "|UID="+builder.UserID;
        //    //sParametros += "|PWD="+builder.Password;
        //    sMensaje = builder.InitialCatalog + '(' + builder.DataSource + ')';
            
        //    //if (psTipo == "L")
        //    //{
        //    //    sParametros += " \"DSN=" + ODBCLocalName;
        //    //    sParametros += "|DESCRIPTION=" + ODBCLocalDesc;
        //    //    sParametros += "|SERVER=" + MaquinaLocal + ODBCLocalServ;
        //    //    sParametros += "|TRUSTED_CONNECTION=False";
        //    //    sParametros += "|DATABASE=" + BDLocal;
        //    //    //sParametros += "|UID="+ UserLocal;
        //    //    //sParametros += "|PWD=" + PassLocal;
        //    //    sMensaje = ODBCLocalName;
        //    //}
        //    sParametros += "\"}";

        //    System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
        //    myProcess.StartInfo.FileName = "odbcconf.exe";
        //    myProcess.StartInfo.Arguments = @" /a {CONFIGSYSDSN " + sParametros;
        //    try
        //    {
        //        myProcess.Start();
        //        myProcess.WaitForExit();
        //        MessageBox.Show("\nConexion ODBC " + sMensaje + " creada Exitosamente\n", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
        //    }
        //    catch (Exception ex)
        //    {
        //        MessageBox.Show("\nError al crear la conexion ODBC, Error: " + ex.Message,"",MessageBoxButtons.OK,MessageBoxIcon.Error);
        //        return;
        //    }
        //    finally
        //    {
        //        myProcess.Dispose();
        //    }
        //}

        //public void FormatearTextBoxs(Form form)
        //{            
        //    //-- Mapeo todo el formulario recursivamente para Obtener todos los Contenedores del mismo
        //    foreach (Control c in form.Controls)
        //    {
        //        if (c.GetType().ToString().Equals("System.Windows.Forms.Panel"))
        //        {
        //            this.FormatearTextBoxs(((System.Windows.Forms.Panel)c).Controls);
        //        }
        //        else if (c.GetType().ToString().Equals("System.Windows.Forms.GroupBox"))
        //        {
        //            this.FormatearTextBoxs(((System.Windows.Forms.GroupBox)c).Controls);
        //        }
        //        this.FormatearTextBoxs(form.Controls);
        //    }
        //}
        //private void FormatearTextBoxs(Control.ControlCollection controls)
        //{
        //    foreach (Control c in controls)
        //    {
        //        if (c.GetType().ToString().Equals("System.Windows.Forms.Panel"))
        //        {
        //            this.FormatearTextBoxs(((System.Windows.Forms.Panel)c).Controls);
        //        }
        //        else if (c.GetType().ToString().Equals("System.Windows.Forms.GroupBox"))
        //        {
        //            this.FormatearTextBoxs(((System.Windows.Forms.GroupBox)c).Controls);
        //        }

        //        if (c.GetType().ToString().Equals("System.Windows.Forms.TextBox"))
        //        {
        //            ((System.Windows.Forms.TextBox)c).Leave += new System.EventHandler(Utils.textBox_Leave);
        //            ((System.Windows.Forms.TextBox)c).Enter += new System.EventHandler(Utils.textBox_Enter);
        //        }                
        //    }
        //}
        //public static void textBox_Leave(object sender, EventArgs e)
        //{
        //    if (((System.Windows.Forms.TextBox)sender).ReadOnly || !((System.Windows.Forms.TextBox)sender).Enabled)
        //    {
        //        return;
        //    }
            
        //    double value;
        //    if (double.TryParse(((System.Windows.Forms.TextBox)sender).Text.Trim(), out value))
        //    {
        //        ((System.Windows.Forms.TextBox)sender).Text = value.ToString("#,0.00");//"#" + System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyGroupSeparator + "0" + System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator + "00");
        //    }
        //}
        //public static void textBox_Enter(object sender, EventArgs e)
        //{
        //    if (((System.Windows.Forms.TextBox)sender).ReadOnly || !((System.Windows.Forms.TextBox)sender).Enabled)
        //    {
        //        return;
        //    }

        //    double value;
        //    if (double.TryParse(((System.Windows.Forms.TextBox)sender).Text.Trim(), out value))
        //    {
        //        ((System.Windows.Forms.TextBox)sender).Text = value.ToString();
        //    }
        //}
    }
}
